package com.wn.product.work1;

import com.wn.product.handler.ConfirmCallBack;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author yellow Docter
 * @date 2022 -11-02
 * @desc  消费发布确认的优化
 *
 *  1、发送消息 setConfirmCallback  确保消息到 交换机中
 *  2、发送消息 setReturnCallback   确保消息从 交互通过路由到 队列中(错误的时候 才会执行 下面的回调 )
 *
 *  可以把 回调接口,setConfirmCallback,setReturnCallback 放到一个单独的类中
 *
 *
 */
@Component
@Slf4j
public class Work06Product {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private ConfirmCallBack confirmCallBack;

    /**
     * 发送消息的方法
     * @param msg
     */
    public void sendMsg(String exchangeName,String key,String msg){

        //消息发送到交换机的 监听 (回调)
        rabbitTemplate.setConfirmCallback(confirmCallBack);

        //发送消息到 队列中进行回调操作
        rabbitTemplate.setMandatory(true);

        //错误的时候 才会执行 下面的回调
        rabbitTemplate.setReturnCallback(confirmCallBack);

        /**
         * 发送消息的方法：
         * 1、交换机   不给 使用默认的交换机
         * 2、路由key  (队列)
         * 3、发送的消息 (object 都是消息 )
         */
        rabbitTemplate.convertAndSend(exchangeName,key,msg);
        log.info("消息发送成功:===>{},路由是:{}",msg,key);

    }

}
